#include "../include/head.h"
int curman;

void stu_manage()
{
    // Pnode_student H=creat_list_stu();
    Pnode_student read_H=creat_list_stu();
    read_file_stu(read_H);
    Pnode_student p;
    system("clear");
    int ch;
    while (1)
    {
        
        stu_menu();
        scanf("%d",&ch);
        getchar();
        
        switch (ch)
        {
        case 1:
            system("clear");
            printf("\n----- 所有学生信息 -----\n");
            print_all_students(read_H);
            sort_students_ind(read_H);
            printf("\n当前学生列表:\n");
            print_all_students(read_H);
            break;
        case 2:
            system("clear");
            find_stu_data_file(read_H);
            break;
        case 3:
            system("clear");
            change_stu_data_file(read_H);
            
            break;
        case 4:
            clear_list_stu(read_H);
            return ;
            system("clear");
            break;
        default:
        printf("iii\n");
            break;
        }
    }
}

//学生个人信息菜单
void stu_menu(void)
{
    char m[4][100]={"1.查看学生排序","2.查询个人信息","3.修改个人信息","4.退出"};
    printf("\n----------------------------\n学生系统\n------------------------\n");
    for (int i=0;i<4;i++)
    printf("%s\n",m[i]);
    printf("----------------------------\n");
}


void write_file_stu(Pnode_student head)
{
    printf("写入文件\n");
    FILE *fp=fopen("./student_management/data/stu.txt","w");
    if(fp==NULL){ printf("文件打卡失败\n");return;}

    Pnode_student p=head->next;//头节点不存数据

    while(p!=head)
    { printf("开始写入\n");
        fwrite(&p->info,sizeof(Data_type),1,fp);
        p=p->next;
    }
    fclose(fp);
    printf("文件写入完成\n");

}

//查询个人信息
void read_file_stu(Pnode_student head)
{
    FILE *fp=fopen("./student_management/data/stu.txt","r");
    if(fp==NULL)
    {
        printf("读取文件打开失败\n");
        curman=0;
        return;
    }
    clear_list_stu(head);
    curman=0;
    Data_type stu;
    while (fread(&stu, sizeof(Data_type), 1, fp) == 1) 
    {
        // printf("读取学生: %s, 成绩: %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n", 
        //        stu.name, stu.score[0], stu.score[1], stu.score[2],
        //        stu.score[3], stu.score[4], stu.score[5]);
        tail_insert_stu(head, stu);
        curman++;
    }
    printf("curman:%d\n",curman);
    fclose(fp);
    printf("已读取学生信息\n");
}


Data_type FindputData2(Pnode_student head,char *find)
{
    Data_type temp={0};
    Pnode_student p=head->next;
    for(int i=0;i<curman;i++)
    {
        if(strcmp(p->info.name,find)==0)
        {
            temp=p->info;
            break;
        }
        p=p->next;
    }
   

    return temp;
}
void find_stu_data_file(Pnode_student head)
{
    char find_name[20];
    printf("请输入要查询的姓名：");
    if (scanf("%19s", find_name) != 1) {
        printf("输入无效！\n");
        while (getchar() != '\n'); // 清空缓冲区
        return;
    }
    getchar();
    
    Data_type  find_data=FindputData2(head,find_name);
    if(strlen(find_data.name)!=0){
    printf("\n%-10s%-10s%-10s%-8s%-8s%-8s%-8s%-8s%-8s\n", 
               "姓名", "班级", "学号", "语文", "数学", "英语", "物理", "化学","生物");
        printf("------------------------------------------------------------\n");
        printf("%-10s%-10s%-10s%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf\n", 
               find_data.name, find_data.class, find_data.id,
               find_data.score[0], find_data.score[1],
               find_data.score[2], find_data.score[3],
               find_data.score[4],find_data.score[5]);
    }
    else
    printf("查无此人\n");
}


void find_ind(Pnode_student read_HSTU)
{
    printf("输出学生信息\n");
    read_file_stu(read_HSTU);
    Pnode_student p=read_HSTU->next;
    while (p!=read_HSTU)
    {
        printf("学生信息：姓名%s\t班级%s\t学号%s\t",p->info.name,p->info.class,p->info.id);
        printf("学生成绩： %.2lf %.2lf  %.2lf %.2lf %.2lf %.2lf\n",p->info.score[0],p->info.score[1],p->info.score[2],p->info.score[3],p->info.score[4],p->info.score[5]);
        p=p->next;
                
    }
}



//修改学生个人信息
void change_stu_data_file(Pnode_student head)
{
   char find_name[20];
    printf("请输入要修改的学生姓名：");
    if (scanf("%19s", find_name) != 1) {
        printf("输入无效！\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        return;
    }
    getchar();

    // 2. 查找学生
    Pnode_student p = head->next;
    while (p != head) {
        if (strcmp(p->info.name, find_name) == 0) {
            // 3. 显示当前信息
            printf("当前学生信息：\n");
            printf("学号：%s\n姓名：%s\n班级：%s\n", p->info.id, p->info.name, p->info.class);
            //printf("学科：语文数学英语物理化学生物")
            printf("成绩：%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n",p->info.score[0], p->info.score[1], p->info.score[2], p->info.score[3], p->info.score[4],p->info.score[5]);

            // 4. 选择要修改的字段
            printf("\n请选择要修改的字段：\n");
            printf("1. 学号\n2. 姓名\n3. 班级\n4.退出\n");
            printf("输入选项（1-4）：");
            
            int choice;
            if (scanf("%d", &choice) != 1 || choice < 1 || choice > 4) {
                printf("无效选项！\n");
                return;
            }
            getchar(); // 清空输入缓冲区

            // 5. 根据选择修改特定字段
            switch (choice) {
                case 1: // 修改学号
                    printf("请输入新学号：");
                    scanf("%19s", p->info.id);
                    break;
                case 2: // 修改姓名
                    printf("请输入新姓名：");
                    scanf("%19s", p->info.name);
                    break;
                case 3: // 修改班级
                    printf("请输入新班级：");
                    scanf("%19s", p->info.class);
                    break;
                case 4: // 修改班级
                    return;
                    break;
                default: // 修改其他科目成绩
                    break;
            }
            getchar(); // 清空输入缓冲区

            // 6. 保存到文件
            write_file_stu(head);
            printf("修改成功！\n");
            return;
        }
        p = p->next;
    }
    printf("未找到学生：%s\n", find_name);
}


// 学生信息排序（学号排序）
void sort_students_ind(Pnode_student head) {
    // read_file_stu(head);
    if (head->next == head || head->next->next == head) {
        printf("学生信息不足，无需排序！\n");
        return ;
    }
    
    // 冒泡排序
    int swapped;
    Pnode_student ptr1,node;
    Pnode_student lptr = head;
    
    do {
        swapped = 0;
        ptr1 = head->next;
        
        while (ptr1->next != lptr) {
            node=ptr1->next;
            // 按学号排序
            
            if (strcmp(ptr1->info.id, node->info.id) > 0) {
                // 交换节点数据
                //printf("ppp\n");
                Data_type temp = ptr1->info;
                ptr1->info =node->info;
                node->info = temp;
                swapped = 1;
                
            }
            
            ptr1 = ptr1->next;
            
        }
        
        lptr = ptr1;
    } while (swapped);
    
    printf("学生信息已按学号排序！\n");
    return ;
}

// void sort_students_ind(Pnode_student head) 
// {
//     if (head->next == head || head->next->next == head) {
//          printf("学生信息不足，无需排序！\n");
//          return ;
//     }
//     int swapped;
//     int choice;
//     Pnode_student ptr1, ptr2;
//     Pnode_student lptr = head;

//     printf("\n请选择要排序的方式：\n");
//     printf("1. 按学号排序\n2. 按第1科成绩\n3. 按第2科成绩\n4. 按第3科成绩\n5. 按第4科成绩\n6. 按第5科成绩\n7. 按第6科成绩\n");
//     printf("输入选项（1-7）：");
//     if (scanf("%d", &choice) != 1 || choice < 1 || choice > 7) {
//         printf("无效选项！\n");
//         return ;
//     }
//     getchar(); // 清空输入缓冲区

//     do {
//         swapped = 0;
//         ptr1 = head;
//         ptr2 = head->next;
//         while (ptr2 != lptr) {
//             switch (choice) {
//             case 1: // 按学号排序
//                 if (strcmp(ptr1->info.id, ptr2->info.id) > 0) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 2: // 按第1科成绩排序
//                 if (ptr1->info.score[0] < ptr2->info.score[0]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 3: // 按第2科成绩排序
//                 if (ptr1->info.score[1] < ptr2->info.score[1]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 4: // 按第3科成绩排序
//                 if (ptr1->info.score[2] < ptr2->info.score[2]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 5: // 按第4科成绩排序
//                 if (ptr1->info.score[3] < ptr2->info.score[3]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 6: // 按第5科成绩排序
//                 if (ptr1->info.score[4] < ptr2->info.score[4]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             case 7: // 按第5科成绩排序
//                 if (ptr1->info.score[4] < ptr2->info.score[4]) {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr2->info;
//                     ptr2->info = temp;
//                     swapped = 1;
//                 }
//                 break;
//             default:
//                 break;
//             }
//             ptr1 = ptr2;
//             ptr2 = ptr2->next;
//         }
//         lptr = ptr1;
//     } while (swapped);

//     printf("学生信息已排序！\n");
//     return ;
// }

    


// 输出全部学生信息函数
void print_all_students(Pnode_student head) {
    Pnode_student p = head->next;
    if (p == head) {
        printf("无学生记录！\n");
        return;
    }

    printf("\n%-13s%-14s%-14s%-10s%-10s%-10s%-10s%-10s%-10s\n", 
           "姓名", "班级", "学号", "语文", "数学", "英语", "物理", "化学","生物");
    printf("--------------------------------------------------------------------------------\n");
    
    while (p != head) {    
        printf("%-12s%-12s%-12s%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf\n", 
               p->info.name, p->info.class, p->info.id,
               p->info.score[0], p->info.score[1],
               p->info.score[2], p->info.score[3],
               p->info.score[4],p->info.score[5]);
                p=p->next;
            
    }
}
 